home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / UNIXLIB37B / src / c / strtol < prev    next >
Text File  |  1990-09-26  |  2KB  |  129 lines

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) strtol.c 1.3 "__DATE__" HJR";
  3. #else
  4. static char sccs_id[] = "@(#) strtol.c 1.3 26/9/90 HJR";
  5. #endif
  6.  
  7. /* strtol.c (c) Copyright 1990 H.Rogers */
  8.  
  9. #include <ctype.h>
  10. #ifdef __STDC__
  11. #include <stdlib.h>
  12. #else
  13. extern int atoi();
  14. extern long atol();
  15. extern long strtol();
  16. extern unsigned long strtoul();
  17. #endif
  18.  
  19. #ifdef __STDC__
  20. int (atoi)(register const char *s)
  21. #else
  22. int (atoi)(s)
  23. register const char *s;
  24. #endif
  25. {
  26. return(atoi(s));
  27. }
  28. #ifdef __STDC__
  29. long (atol)(register const char *s)
  30. #else
  31. long (atol)(s)
  32. register const char *s;
  33. #endif
  34. {
  35. return(atol(s));
  36. }
  37.  
  38. #define digit(x)    (((x) > '9') ? (((x) & 31) + 9) : ((x) - '0'))
  39.  
  40. #ifdef __STDC__
  41. long strtol(register const char *s,char **end,register int b)
  42. #else
  43. long strtol(s,end,b)
  44. register const char *s;
  45. char **end;
  46. register int b;
  47. #endif
  48. {
  49. register long r = 0L;
  50. register int r_ = 0,d;
  51.  
  52. if (!s) return(r);
  53.  
  54. while (isspace(*s)) s++;
  55.  
  56. if (*s == '+' || *s == '-')
  57.   {
  58.   if (*s == '-') r_ = 1;
  59.   s++;
  60.   }
  61.  
  62. if (!b)
  63.   {
  64.   if (*s == '0')
  65.     {
  66.     s++;
  67.     b = 010;
  68.     if (*s == 'x') { s++; b = 0x10; }
  69.     }
  70.   else
  71.     b = 10;
  72.   }
  73. else
  74.   if (b == 16)
  75.     if (*s == '0' && *++s == 'x') s++;
  76.  
  77. while (d = digit(*s),d >= 0 && d < b)
  78.   {
  79.   r = r * (long)b + (long)d;
  80.   s++;
  81.   }
  82.  
  83. if (end) *end = (char *)s;
  84.  
  85. return(r_ ? -r : r);
  86. }
  87.  
  88. #ifdef __STDC__
  89. unsigned long strtoul(register const char *s,char **end,register int b)
  90. #else
  91. unsigned long strtoul(s,end,b)
  92. register const char *s;
  93. char **end;
  94. register int b;
  95. #endif
  96. {
  97. register unsigned long r = 0;
  98. register int d;
  99.  
  100. if (!s) return(r);
  101.  
  102. while (isspace(*s)) s++;
  103.  
  104. if (!b)
  105.   {
  106.   if (*s == '0')
  107.     {
  108.     s++;
  109.     b = 010;
  110.     if (*s == 'x') { s++; b = 0x10; }
  111.     }
  112.   else
  113.     b = 10;
  114.   }
  115. else
  116.   if (b == 16)
  117.     if (*s == '0' && *++s == 'x') s++;
  118.  
  119. while (d = digit(*s),d >= 0 && d < b)
  120.   {
  121.   r = r * (unsigned long)b + (unsigned long)d;
  122.   s++;
  123.   }
  124.  
  125. if (end) *end = (char *)s;
  126.  
  127. return(r);
  128. }
  129.